package com.pandaroid.pandaclock;

import com.skt.arm.aidl.IArmService;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

/**
 * AppWidget Configuration Activity
 * 
 * com.pandaroid.clockno1
 * PandaClockConfigureActivity.java
 *
 * @author junhwan_kim
 * @date 2011. 4. 29. 오전 10:59:49
 * @Version 
 */
public class PandaClockConfigure extends Activity {
	
	private static final String TAG = "PandaClockNo1";
	
//	public static final String DEFAULT_THEME = "DefaultTheme";
	public static final String BLACK_THEME = "BlackTheme";
	public static final String WHITE_THEME = "WhiteTheme";
	
	private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
	private String selectedTheme;
	private static boolean[] themeToggle = {false, false};
	
	Button btnWhiteTheme;
	Button btnBlackTheme;
	
	// DRM
		private IArmService	service;
		private ArmServiceConnection armCon;
		private String resMsg;
		private String AID = "OA00252599";
		
		private static final String DIALOG_ERROR_04 = "04";
		private static final String DIALOG_ERROR_08 = "08";
		private static final String DIALOG_ERROR_0E = "0E";
		private static final String DIALOG_ERROR_09 = "09";
		private static final String DIALOG_ERROR_0A = "0A";
		private static final String DIALOG_ERROR_0C = "0C";
		private static final String DIALOG_ERROR_0D = "0D";
		private static final String DIALOG_ERROR_11 = "11";
		private static final String DIALOG_ERROR_12 = "12";
		private static final String DIALOG_ERROR_13 = "13";
		private static final String DIALOG_ERROR_14 = "14";
		
	/**
	 * Widget Id 추출 
	 * Image Directory를 Spinner에 List
	 * Setting On/Off Item을 ListView에 List
	 * 
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 * @Method onCreate
	 * @param savedInstanceState
	 *
	 * @author junhwan_kim
	 * @date 2011. 4. 29. 오전 10:59:32
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);

	    Log.i(TAG, "DateWidgetConfigureActivity-onCreate()");
		
	    /// 기본 선택값을 CANCELED로 지정해 사용자가 뒤로가기로 Activity를 닫는 경우 취소 결과값을 반환하도록 함.
	    setResult(RESULT_CANCELED);
	    
	    setContentView(R.layout.appwidget_configure);
	    
	    // DRM
	    if(!runService()){
        	resMsg = "ARM 연동실패"; 
			showDialog(0);
        }
	    
	    // Splash(로딩화면) 띄우기
//	    startActivity(new Intent(this, SplashActivity.class));
	    
	    /// 추가하려는 widgetID 추출
	    Intent intent = getIntent();
	    mAppWidgetId = intent.getIntExtra("SELECTED_WIDGET_ID", AppWidgetManager.INVALID_APPWIDGET_ID);
	    
	    /// 정상적인 경로로 호출되지 않은 경우 Activity를 종료한다.
	    if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
	    	mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
	    	if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
	    		finish();
	    	} else {
	    		String [] initPrefValue = {String.valueOf(mAppWidgetId), BLACK_THEME, "1", "1", "1"};
		    	PandaClockPreferences.setPref(getBaseContext(), initPrefValue);
	    	}
	    }
	    
	    /// Shared Preferences에서 설정값을 가져온다., junhwan_kim, 2011.05.12
	    String[] prefValue = PandaClockPreferences.getPref(this, mAppWidgetId);
	    selectedTheme = prefValue[PandaClockPreferences.THEME];
    	
	    /// id연결
    	btnWhiteTheme = (Button) findViewById(R.id.btn_white_theme);
    	btnBlackTheme = (Button) findViewById(R.id.btn_black_theme);
    	
    	/// 선택된 Theme에 따라 버튼클릭된 이미지를 보여준다.
    	if (selectedTheme.equals(BLACK_THEME)) {
    		btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_on);
			btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_off);
			themeToggle[0] = true;
			themeToggle[1] = false;
    	} else if (selectedTheme.equals(WHITE_THEME)) {
    		btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_off);
			btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_on);
			themeToggle[0] = false;
			themeToggle[1] = true;
    	}
    	
    	/// 버튼 클릭 리스너
    	btnWhiteTheme.setOnClickListener(mClickListener);
    	btnBlackTheme.setOnClickListener(mClickListener);
    	findViewById(R.id.btnOK).setOnClickListener(mClickListener);
	    findViewById(R.id.btnCancel).setOnClickListener(mClickListener);
	}
	
	/**
	 * Interface definition for a callback to be invoked when a view is clicked.
	 * OK 버튼 Click 이벤트
	 * 
	 * @see android.view.View.OnClickListener
	 * 
	 * @author junhwan_kim
	 * @date 2011. 4. 29. 오전 11:29:51
	 */
	Button.OnClickListener mClickListener = new Button.OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.btn_white_theme:
				if (themeToggle[0] == true) {
					selectedTheme = WHITE_THEME;
					themeToggle[0] = false;
					themeToggle[1] = true;
					btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_off);
					btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_on);
				} else {
					selectedTheme = BLACK_THEME;
					themeToggle[0] = true;
					themeToggle[1] = false;
					btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_on);
					btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_off);
				}
				break;
			case R.id.btn_black_theme:
				if (themeToggle[1] == true) {
					selectedTheme = BLACK_THEME;
					themeToggle[0] = true;
					themeToggle[1] = false;
					btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_on);
					btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_off);
				} else {
					selectedTheme = WHITE_THEME;
					themeToggle[0] = false;
					themeToggle[1] = true;
					btnWhiteTheme.setBackgroundResource(R.drawable.c_button_1_off);
					btnBlackTheme.setBackgroundResource(R.drawable.c_button_2_on);
				}
				break;
			case R.id.btnOK:
				if(selectedTheme != null) {
			    	/// widgetID별로 설정을 SharedPreference에 저장한다.
					String [] prefValue = {String.valueOf(mAppWidgetId), selectedTheme, "1", "1", "1"};
					
			    	PandaClockPreferences.setPref(getBaseContext(), prefValue);
			    	PandaClockPreferences.setWidgetId(getBaseContext(), String.valueOf(mAppWidgetId));
			    	
			    	/// 최초의 업데이트를 수행한다.
			    	AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());
			    	PandaClockProvider.updateWidget(getBaseContext(), appWidgetManager, mAppWidgetId);
			    	
			    	/// Configure의 일반 종료 처리
			    	Intent intent = new Intent();
			    	intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
			    	setResult(RESULT_OK, intent);
			    	finish();
			    }
				break;
			case R.id.btnCancel:
				finish();
				break;
			}
		}
	};
	
	@Override
	protected void onDestroy() {
		RecycleUtils.recursiveRecycle(getWindow().getDecorView());
		System.gc();
		
		Log.i(TAG, "onDestoy()");
		
		super.onDestroy();
	}
	
	// DRM
		private boolean runService(){
			try{
				if(armCon == null){
					armCon = new ArmServiceConnection();
					boolean conRes = bindService(new Intent(IArmService.class.getName()), armCon, Context.BIND_AUTO_CREATE);
					if(conRes)					return true;
				}
			}catch(Exception e){
				e.printStackTrace();
			}
			releaseService();
			return false;
		}
		
		// DRM
		private void releaseService(){
			if(armCon != null){
				unbindService(armCon);
				armCon = null;
				service = null;
			}
		}
		
		// DRM
		class ArmServiceConnection implements ServiceConnection{
			public void onServiceConnected(ComponentName name, IBinder boundService) {
				if(service == null)
					service = IArmService.Stub.asInterface((IBinder) boundService);
				try{
					int res = service.executeArm(AID);
					resMsg = Integer.toHexString(res);
					switch (res) {
					case 1:
						break;
					default:
						if (resMsg.equals(DIALOG_ERROR_04)) {
							resMsg = "일시적인 장애로 라이선스 발급에 실패하였습니다. 잠시후에 다시 시도해 주십시요.";
						} else if (resMsg.equals(DIALOG_ERROR_08)) {
							resMsg = "일시적인 장애로 라이선스 발급에 실패하였습니다. 잠시후에 다시 시도해 주십시요.";
						} else if (resMsg.equals(DIALOG_ERROR_0E)) {
							resMsg = "일시적인 장애로 라이선스 발급에 실패하였습니다. 잠시후에 다시 시도해 주십시요.";
						} else if (resMsg.equals(DIALOG_ERROR_09)) {
							resMsg = "상품 구매내역 확인에 실패하였습니다. 자세한 사항은 고객센터로 문의 바랍니다.";
						} else if (resMsg.equals(DIALOG_ERROR_0A)) {
							resMsg = "Tstore 미가입된 단말입니다. 가입 후 이용을 해주시기 바랍니다.";
						} else if (resMsg.equals(DIALOG_ERROR_0C)) {
							resMsg = "일시적인 장애로 라이선스 발급에 실패하였습니다. 잠시후에 다시 시도해 주십시요.";
						} else if (resMsg.equals(DIALOG_ERROR_0D)) {
							resMsg = "어플리케이션의 라이선스 정보 확인이 불가능합니다. 자세한 사항은 고객센터로 문의 바랍니다.";
						} else if (resMsg.equals(DIALOG_ERROR_11)) {
							resMsg = "핸드폰 번호를 확인할 수 없습니다. USIM 장착여부 확인 및 USIM 잠금이 된 경우 해제를 해주시기 바랍니다.";
						} else if (resMsg.equals(DIALOG_ERROR_12)) {
							resMsg = "어플리케이션의 정보 확인이 불가능합니다. 자세한 사항은 고객센터로 문의 바랍니다.";
						} else if (resMsg.equals(DIALOG_ERROR_13)) {
							resMsg = "핸드폰에서 데이타통신(3G, WIFI)이 되고 있지 않습니다. 핸드폰의 데이터 통신 설정부분을 확인 후 재 실행을 해 주십시요.";
						} else if (resMsg.equals(DIALOG_ERROR_14)) {
							resMsg = "Tstore 전용프로그램이 설치 되어 있지 않습니다. Tstore 전용프로그램을 설치하싞 후 재 실행을 해 주십시요.";
						}
						showDialog(0);
						break;
					}
				}catch(Exception e){
					e.printStackTrace();
					releaseService();
					resMsg = "서비스 실행 실패";
					showDialog(0);
					return;
				}
				releaseService();
			}	
			
			public void onServiceDisconnected(ComponentName name) {
				service = null;
			}
		}
		
		// DRM
		protected Dialog onCreateDialog(int id) {
			return new AlertDialog.Builder(this)
			.setIcon(R.drawable.alert_dialog_icon)
			.setTitle("알 림")
			.setMessage(resMsg)
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
			    public void onClick(DialogInterface dialog, int whichButton) {
			    	finish();
			    }
			})
			.create();
		}
}
